L'exportation en chaîne de caractères doit se faire en tenant compte du style. En effet, la structure de donnée IndexStyle
contient les éléments intermédiaires à placer entre les différents éléments.
Une fonction principale showIndexSections
permet de générer l'index. Le préambule et le postambule sont ajoutés par concaténation à parti des chaînes idxPreamble
et idxPostamble
.
Pour afficher une section sous forme de chaîne de caractères, on intercale (avec la fonction intercalate
) la chaîne qui fait la jonction entre deux sections.
On s'assure de ne prendre que des sections contenant des sous-sections en filtrant avec filter
les sous-sections qui ne sont pas vides (not (null sub)
).
On appelle avec map
et showIndexSection
chaque section pour les convertir en chaînes de caractères.
showIndexSections :: IndexStyle -- ^ The index style.
-> [IndexSection] -- ^ The list of section of the index.
-> String -- ^ The output string in the LaTeX format.
showIndexSections style [] = ""
showIndexSections style lst = intercalate (idxGroupSkip0 style) (map (showIndexSection style) lstf)
where lstf = filter (\(IndexSection tit sub) -> not (null sub)) lst
Une section est affichée de la façon suivante :
Le titre.
Le suffixe en utilisant idxHeadingSufL0
.
Les éventuelles sous sections.
Les présences des sections et du titre sont détectés grâce aux empreintes appropriées dans la définition de la fonction ([]
et ""
) :
showIndexSection :: IndexStyle -> IndexSection -> String
showIndexSection style (IndexSection "" sub) = showIndexSubSections style sub -- Empreinte avec absence de titre
showIndexSection style (IndexSection tit [] ) = idxHeadingPreL0 style -- Empreinte avec absence de sous sections
++ tit
++ idxHeadingSufL0 style
showIndexSection style (IndexSection tit sub) = idxHeadingPreL0 style
++ tit
++ idxHeadingSufL0 style
++ showIndexSubSections style sub
L'exportation des sous-sections se fait de la même façon que les sections. Les différences sont que :
On utilise les chaînes de caractère associées aux sous-sections.
On appelle la fonction permettant de convertir les items en chaînes de caractères.
Les entrées d'index sont exportées en affichant :
La chaîne de caractère à insérer avant un item.
Le nom de l'item.
Le délimiteur entre le nom et les numéros de page idxDelim0
.
Les numéros de pages (en ajoutant la commande LaTeX \hyperpage
devant chaque numéro).
Les éventuels sous-items.
Pour convertir les en-têtes, là encore on se base sur le style.
Pour savoir dans quel type de section on se trouve, on utilise le pattern matching:
showHeading1 sty (Letters, a) ...
showHeading1 sty (Numbers, a) ...
showHeading1 sty (Symbols, a) ...
Si la section en cours concerne des mots (Commençant par des lettres).
Selon la valeur du style idxHeadingFlag0
on aura:
Si idxHeadingFlag0 == UpperCase
(Majuscules) alors on prend la première lettre take 1
et on la convertit en majuscule avec toUpper
Si idxHeadingFlag0 == LowerCase
(Minuscules) alors on prend la première lettre take 1
et on la convertit en majuscule avec toLower
Si la section en cours concerne des nombres (Commençant par des chiffres). On utilise le champ idxNumhead
qui contient l'en-tête dédié à la section des nombres.
Si la section en cours concerne des symboles (Commençant par des symboles). On utilise le champ idxNumhead
qui contient l'en-tête dédié à la section des nombres.
showHeading1 sty (Letters, a) | idxHeadingFlag0 sty == UpperCase = map toUpper (take 1 a)
| idxHeadingFlag0 sty == LowerCase = map toLower (take 1 a)
| otherwise = ""
showHeading1 sty (Numbers, a) | idxHeadingFlag0 sty == UpperCase = idxNumhead sty
| idxHeadingFlag0 sty == LowerCase = idxNumhead sty
| otherwise = ""
showHeading1 sty (Symbols, a) | idxHeadingFlag0 sty == UpperCase = idxSymhead sty
| idxHeadingFlag0 sty == LowerCase = idxSymhead sty
| otherwise = ""
Les en-têtes de niveau 2 sont des en-têtes permettant de subdiviser le classement de l'index.
Comme les en-têtes de niveau 1, on affiche le titre en fonction du style.
Si la section en cours concerne des mots (Commençant par des lettres).
Selon la valeur du style idxHeadingFlag1
on aura:
Si idxHeadingFlag1 == UpperCase
(Majuscules) alors on prend les deux premières lettres take 2
et on les convertit en majuscule avec toUpper
Si idxHeadingFlag1 == LowerCase
(Minuscules) alors on prend les deux premières lettres take 2
et on les convertit en majuscule avec toLower
Si la section en cours concerne des nombres (Commençant par des chiffres) alors on prend le premier caractère take 1
.
Si la section en cours concerne des symboles (Commençant par des symboles), la aussi on prend le premier caractère take 1
.
showHeading2 sty (Letters, a) | idxHeadingFlag1 sty == UpperCase = map toUpper (take 2 a)
| idxHeadingFlag1 sty == LowerCase = map toLower (take 2 a)
| otherwise = ""
showHeading2 sty (Numbers, a) | idxHeadingFlag1 sty == UpperCase = take 1 a
| idxHeadingFlag1 sty == LowerCase = take 1 a
| otherwise = ""
showHeading2 sty (Symbols, a) | idxHeadingFlag1 sty == UpperCase = take 1 a
| idxHeadingFlag1 sty == LowerCase = take 1 a
| otherwise = ""
On peut aussi simplifier les empreintes Numbers
et Symbols
en modifiant les gardes :
showHeading2 sty (Numbers, a) = if idxHeadingFlag1 sty == None
then ""
else take 1 a
showHeading2 sty (Symbols, a) = if idxHeadingFlag1 sty == None
then ""
else take 1 a